浅拷贝 vs 深拷贝

java的对象拷贝分为浅拷贝和深拷贝两种方式

浅拷贝

对于基本类型:属于值传递,将值复制一份给新的对象,新的对象属性复制了一份属性,两个对象拥有了两份属性。 对于引用类型:属于引用传递,将引用传递了一份。引用所指向的对象是相同的。因此其中一个对象的修改会影响另一个对象的值。

String类型是一种特例。虽然String是引用类型,但是他的值是放在字符串常量池中。当对象的重新赋值后,引用的地址发生了改变。

浅拷贝的两种方式

  • 构造器方式
  • 重写clone()

深拷贝

对于基本类型:属于值传递,将值复制一份给新的对象,新的对象属性复制了一份属性,两个对象拥有了两份属性。 对于引用类型:不仅复制了对象中所有的成员变量值,也为复制后的成员变量开辟了新的内存空间,新的对象的引用类型指向的是新的成员变量的地址。

深拷贝的两种方式

  • 重写clone(),为每一层对象进行拷贝
  • 通过对象序列号实现拷贝

示例代码

代码地址